package com.bjsxt.shop.back.springmvc.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.shop.common.controller.BaseController;
import com.bjsxt.shop.common.util.ConstatFinalUtil;
import com.bjsxt.shop.common.util.PageInfoUtil;
import com.bjsxt.shop.goods.pojo.AGoods;
import com.bjsxt.shop.goods.pojo.AGoodsBrand;
import com.bjsxt.shop.goods.pojo.AGoodsBrandEnum;
import com.bjsxt.shop.goods.pojo.AGoodsCate;
import com.bjsxt.shop.goods.service.IGoodsService;
import com.bjsxt.shop.users.pojo.AAdmins;

/**
 * URL规划,拦截器拦截
 * 
 * @author WangshSxt
 *
 */
@Controller
@RequestMapping("/back/goods/")
public class GoodsBackController extends BaseController
{
	@Resource
	private IGoodsService goodsService;

	/**
	 * 品牌列表开始
	 * 用来跳转到品牌列表的页面
	 */
	@RequestMapping("/brandList")
	public String brandList()
	{
		ConstatFinalUtil.SYS_LOGGER.info("---brandList--");
		return "/back/goods/brandList";
	}

	/**
	 * 品牌列表--返回JSON数据
	 * 
	 * { "total":28, "rows": [ {"productid":"AV-CB-01","productname":
	 * "Amazon Parrot", "unitcost":92.00,"status":"P","listprice":63.50,
	 * "attr1":"Adult Male","itemid":"EST-18"} ]}
	 * 
	 * 
	 * @return
	 */
	@RequestMapping(value = "/brandListJSON", produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String brandListJSON(String page, String rows,String keyword,String status,String st,String ed)
	{
		/*
		 * String page,String rows这个是从页面传递过来的 这个是在点击分页的时候，post里面包含的参数
		 */
		ConstatFinalUtil.SYS_LOGGER.info("---brandListJSON--");
		/* 处理get方式的乱码 */
		try
		{
			/*因为mapper文件中已经test="keyword != null and keyword != ''"
			 * 对keyword的值进行了验证，所以不需要再进行非空判断了			 */
			keyword=new String(keyword.getBytes("ISO8859-1"),"UTF-8");
		} catch (Exception e)
		{
		}
		if(status == null)
		{
			keyword="";
		}
		if(st == null)
		{
			ed="";
		}
		if(ed == null)
		{
			ed="";
		}
		Date stDate = null ; 
		Date edDate = null ; 
		/*将st或者ed==“”进行了排除*/
		if(!"".equalsIgnoreCase(st) && !"".equalsIgnoreCase(ed))
		{
			/* 从字符中变成日期时间对象 */
			stDate = this.dateFormatUtil.strDateTime(st);
			edDate = this.dateFormatUtil.strDateTime(ed);
		}
		/*通过page和rows可以传递第几页和每页多少条		 */
		PageInfoUtil pageInfoUtil = this.proccedPageInfo(page, rows);
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("keyword", keyword);
		/* 状态什么时候放到搜索条件中,判断一下 */
		if(!"".equalsIgnoreCase(status))
		{
			condMap.put("status", status);
		}
		condMap.put("stDate", stDate);
		condMap.put("edDate", edDate);
		/* 查询列表 */
		Map<String, Object> resultMap = this.goodsService.findCondListGoodsBrandService(pageInfoUtil, condMap);
		/* 数据 */
		List<AGoodsBrand> brandList = (List<AGoodsBrand>) resultMap.get("list");
		/* 可以通过键值对的形式得到总记录数 */
		int totalRecord = Integer.valueOf(resultMap.get("totalRecord") + "");

		/* 拼装数据,json */
		JSONObject resultJSON = new JSONObject();
		resultJSON.put("total", totalRecord);

		/* 数据 */
		JSONArray dataArr = new JSONArray();
		int count = 1;
		for (Iterator iterator = brandList.iterator(); iterator.hasNext();)
		{
			AGoodsBrand brand = (AGoodsBrand) iterator.next();
			/* 将对象转化为json格式
			 * 通过brand.toJSON可以将对象转化为JSON的形式 */
			JSONObject brandJSON = brand.toJSON();
			brandJSON.put("count", count);

			/* brand对象变成JSON */
			dataArr.add(brandJSON);
			/*通过增加一个属性，不断的让其增加1			 */
			count++;
		}
		resultJSON.put("rows", dataArr);
		/* resultJSON.toJSONString（）用来把json转化为字符串 */
		return resultJSON.toJSONString();
	}

	/**
	 * 品牌添加
	 * 
	 * @return
	 */
	@RequestMapping("/brandInsert")
	public String brandInsert()
	{
		ConstatFinalUtil.SYS_LOGGER.info("---brandInsert--");
		return "/back/goods/brandInsert";
	}

	/**
	 * 品牌添加提交
	 * 主要是为了把文件的上传地址添加到数据库中，在此之前需要建立一个ftpUtil类
	 * @return 返回JSON { "code":"0", "info":"", }
	 */
	@RequestMapping(value = "/brandInsertSubmit", produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String brandInsertSubmit(String pubtimeStr, MultipartFile file, AGoodsBrand goodsBrand, HttpSession session)
	{
		ConstatFinalUtil.SYS_LOGGER.info("---brandInsertSubmit--");
		JSONObject resultJSON = new JSONObject();

		ConstatFinalUtil.SYS_LOGGER.info("--file:{}--", file);

		/* 表示文件必须上传 */
		if (file != null && !"".equalsIgnoreCase(file.getOriginalFilename()))
		{
			/*这里得到的是文件的原始名称，一般是某个文件名.jsp等格式			 */
			String originalFilename = file.getOriginalFilename();
			String fileName = "";
			try
			{
				/* 上传的文件给上传到FTP中 */
				/*
				 * 三个路径的拼装: FTP路径: 相对路径: 网络路径:
				 * uploadfile/brand/2017-06-28/uuid.jpg
				 */
				/*这里的relaPath可以得到upload文件这个目录				 */
				String relaPath = ConstatFinalUtil.CONFIG_JSON.getString("relaPath");
				/*用来拼装brand/2017-06-28/uuid.jpg				 */
				relaPath += "/brand/" + this.dateFormatUtil.dateStr(new Date()) + "/";
				/* uuid.扩展名
				 * 这个方法是为了把原文件名转化为uuid.扩展名的类型
				 * 首先得到上传源文件名字从最后一个.开始到结束的扩展名，
				 * 再用UUID生成一个唯一的标识符，以免文件名重名 */
				fileName = UUID.randomUUID().toString()
						+ originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length());

				boolean flag = this.ftpUtil.uploadFile(fileName, relaPath, file.getInputStream());
				if (flag)
				{
					/*
					 * 上传文件成功 存储数据库:
					 * 首先生成一个目录，把文件名也给带上去，最后储存在数据库中
					 */
					goodsBrand.setLogoPath(relaPath + fileName);
				}
			} catch (Exception e)
			{
				ConstatFinalUtil.SYS_LOGGER.error("上传文件失败了,文件名:{}", fileName, e);
			}
		}

		/* 自己来转换时间,就不用转换器了 */
		goodsBrand.setPubTime(this.dateFormatUtil.strDateTime(pubtimeStr));

		/* 把页面上木有赋值的属性,赋值一下 */
		/* 从Session中获取 */
		AAdmins adminsSess = (AAdmins) session.getAttribute("admins");
		goodsBrand.setAdminsId(adminsSess.getId());
		goodsBrand.setCreateTime(new Date());
		goodsBrand.setUpdateTime(new Date());
		/* 保存数据 */
		resultJSON = this.goodsService.saveOneGoodsBrandService(goodsBrand);
		return resultJSON.toJSONString();
	}
	
	/**
	 * 品牌操作提交完成
	 */
	/*商品模块管理开始*/
	@RequestMapping("/goodsList")
	public String goodsList()
	{
		ConstatFinalUtil.SYS_LOGGER.info("==goodsList===");
		return "/back/goods/goodsList" ; 
	}
	
	/*
	 * 专门取数据	 */
	@RequestMapping(value ="/goodsListJSON",produces="text/html;charset=UTF-8")
	@ResponseBody
	public String goodsListJSON(HttpServletRequest request,String page,String rows,String keyword , String status,String st,String ed)
	{
		ConstatFinalUtil.SYS_LOGGER.info("==goodsList===");
		/* 处理get方式的乱码 */
		try
		{
			keyword = new String(keyword.getBytes("ISO8859-1"), "UTF-8");
		} catch (Exception e)
		{
		}
		/*
		 * 分页信息
		 */
		PageInfoUtil pageInfoUtil = this.proccedPageInfo(page, rows);
		
		/* 搜索条件 */
		if(status == null)
		{
			status = "" ; 
		}
		if(st == null)
		{
			st = "" ; 
		}
		if(ed == null)
		{
			ed = "" ; 
		}
		
		Date stDate = null ; 
		Date edDate = null ; 
		if(!"".equalsIgnoreCase(st) && !"".equalsIgnoreCase(ed))
		{
			/* 从字符中变成日期时间对象 */
			stDate = this.dateFormatUtil.strDateTime(st);
			edDate = this.dateFormatUtil.strDateTime(ed);
		}
		
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("keyword", keyword);
		/* 状态什么时候放到搜索条件中,判断一下 */
		if(!"".equalsIgnoreCase(status))
		{
			condMap.put("status", status);
		}
		condMap.put("stDate", stDate);
		condMap.put("edDate", edDate);
		
		/* 查询列表 */
		Map<String, Object> resultMap = this.goodsService.findCondListGoodsService(pageInfoUtil, condMap);
		/* 数据 */
		List<AGoods> goodsList = (List<AGoods>) resultMap.get("list");
		int totalRecord = Integer.valueOf(resultMap.get("totalRecord") + "");
		
		/* 拼装数据,json */
		JSONObject resultJSON = new JSONObject() ;
		resultJSON.put("total", totalRecord);
		
		/* 数据 */
		JSONArray dataArr = new JSONArray() ; 
		for (Iterator iterator = goodsList.iterator(); iterator.hasNext();)
		{
			AGoods goodsTemp = (AGoods) iterator.next();
			JSONObject brandJSON = goodsTemp.toJSON();
			
			/* brand对象变成JSON */
			dataArr.add(brandJSON);
		}
		resultJSON.put("rows", dataArr);
		return resultJSON.toJSONString() ;
	}
	
	/**
	 * 打开商品添加的页面
	 * 打开页面的时候需要知道商品一共有多少个类，同时保证按照树形结构显示
	 * 打开页面之前先查询一下商品的种类
	 */
	@RequestMapping("/goodsInsert")
	public String goodsInsert(Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("--goodsInsert--");
		
		Map<String, Object> condMap = new HashMap<String, Object>();
		/*这个用来表示清楚condMap中的值		 */
		condMap.clear();
		/* 查询所有启用的品牌 */
		/*状态的值经常改变，所以在设计数据库的时候经常设计成枚举的形式		 */
		condMap.put("status", AGoodsBrandEnum.STATUS_ENABLE.getStatus());
		Map<String, Object> resultMap = this.goodsService.findCondListGoodsBrandService(null, condMap);
		List<AGoodsBrand> brandList = (List<AGoodsBrand>) resultMap.get("list");
		/* 放到四大作用域中
		 * 在service中要存储为list类型，在controller中获取为见名知意的形式 */
		model.addAttribute("brandList", brandList);
		
		/* 查询商品的分类
		 * 在查完品牌之后还需要查询一下商品的分类并让其形成树形结构的形式 */
		List<AGoodsCate> goodsCateTreeList = this.goodsService.findTreeListCateService();
		/* 放到四大作用域中 */
		model.addAttribute("goodsCateTreeList", goodsCateTreeList);
		/*for (Iterator iterator = goodsCateTreeList.iterator(); iterator.hasNext();)
		{
			AGoodsCate aGoodsCate = (AGoodsCate) iterator.next();
			ConstatFinalUtil.SYS_LOGGER.info("aGoodsCate的姓名{}"+aGoodsCate.getName());
			
		}*/
		return "/back/goods/goodsInsert";
	}
	
	/**
	 * 商品添加提交页面
	 */
	@ResponseBody
	@RequestMapping(value="/goodsInsertSubmit",produces="text/html;charset=UTF-8")
	public String goodsInsertSubmit(AGoods goods,String pubtimeStr,HttpSession session,HttpServletRequest request)
	{
		ConstatFinalUtil.SYS_LOGGER.info("--goodsInsert--");
		/*这个是用来表示		 */
		JSONObject resultJSON = new JSONObject() ; 
		/*
		 * request.getParameter("spec_功能_制冷类型")
		 * [
				{
					"name": "功能",
					"keys": [
					{
						"name":"制冷类型",
						"values":"冷暖"
					}
				}
			]
		 * */
		/*
		 * 是以分类为蓝本
		 * 查询用户选择的分类
		 * 选择用户选择的商品分类，主要需要商品中的spec描述，进而插入到商品中 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/*通过商品品种的id得到选择的商品分类		 */
		condMap.put("id", goods.getCateId());
		AGoodsCate goodsCate = this.goodsService.findOneGoodsCateService(condMap);
		/*得到一个JSON形式的规格	
		 * 定义json的最外边的数组类型	 */
		JSONArray specArr = goodsCate.getSpecArr(); 
		for (Iterator iterator = specArr.iterator(); iterator.hasNext();)
		{
			JSONObject jsonTemp1 = (JSONObject) iterator.next();
			JSONArray keysArr = (JSONArray) jsonTemp1.get("keys");
			for (Iterator iterator2 = keysArr.iterator(); iterator2.hasNext();)
			{
				JSONObject jsonKeyTemp2 = (JSONObject) iterator2.next();
				
				/* value从哪来? */
				String keyParam = "spec_" + jsonTemp1.get("name") + "_" + jsonKeyTemp2.get("name");
				/* key:是不确定的
				 * 这里用到了一个很重要的想法，可以通过本页面传递参数值，进而得到value的值 */
				String value = request.getParameter(keyParam);
				jsonKeyTemp2.put("values", value);
			}
		}
		/* 将分类中的规格values由原来的数组变成了值 */
		goods.setSpec(specArr.toJSONString());

		AAdmins adminsSess = (AAdmins) session.getAttribute("admins");
		/* 为页面上木有显示的字段赋值 */
		
		/* 自己来转换时间,就不用转换器了 */
		goods.setPubTime(this.dateFormatUtil.strDateTime(pubtimeStr));
		
		/* 把页面上木有赋值的属性,赋值一下 */
		/* 从Session中获取 */
		goods.setAdminsId(adminsSess.getId());
		goods.setCreateTime(new Date());
		goods.setUpdateTime(new Date());
		
		/* 上传文件 */
		resultJSON = this.goodsService.saveOneGoodsService(goods);
		return resultJSON.toJSONString(); 
	}
	/**
	 * 商品列表结束
	 */
	
}
